java 提取两个list相同部分

您所在的位置:网站首页 java两个list取差集 高效 java 提取两个list相同部分

java 提取两个list相同部分

2024-06-10 09:43| 来源: 网络整理| 查看: 265

a612f7089931b01f02b2fe04ac2b2010.png 引言

经常遇到一些集合类之间的过滤数据、求合集之类的问题,在此以List为例,毕竟在数据库中取数据后,我们使用比较多的是List集合进行操作。

模板 代码 public static void main(String[] args) { List stringList = new ArrayList(); stringList.add("a"); stringList.add("b"); stringList.add("c"); stringList.add("i"); stringList.add("j"); stringList.add("a"); //一、求交集 //方法1:直接通过retainAll直接过滤 List stringList1 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); stringList1.retainAll(stringList); System.out.println("交集1: " + stringList1); //方法2:通过过滤掉存在于stringList的数据 List stringList1_2 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); List strings = stringList1_2.stream() .filter(item -> stringList.contains(item)) .collect(toList()); System.out.println("交集2:" + strings); //二、并集 //有重并集 List stringList2 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); stringList2.addAll(stringList); System.out.println("并集: " + stringList2); //无重并集 List stringList2_2 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); List stringList_1 = new ArrayList(Arrays.asList("a,b,c,i,j,a".split(","))); stringList2_2.removeAll(stringList_1); stringList_1.addAll(stringList2_2); System.out.println("无重并集: " + stringList_1); //三、求差集 //方法1:直接使用removeAll()方法 List stringList3 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); stringList3.removeAll(stringList); System.out.println("差集1: " + stringList3); //方法2:通过过滤掉不存在于stringList的数据,然后和本数组进行交集处理 List stringList3_2 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); stringList3_2.retainAll(stringList3_2.stream() .filter(item -> !stringList.contains(item)) .collect(toList())); System.out.println("差集2:" + stringList3_2); SpringApplication.run(DemoApplication.class, args); } 结果 交集1: [a, b, c] 交集2:[a, b, c] 并集: [a, b, c, d, e, f, g, h, a, b, c, i, j, a] 无重并集: [a, b, c, i, j, a, d, e, f, g, h] 差集1: [d, e, f, g, h] 差集2:[d, e, f, g, h] 注意list赋值问题

如果使用了赋值方式,如 list1 = list0 ,然后 list1.retainAll(list2) 或者 list1.removeAll(list2)其实list0的值也变化了。因为lis1和list0指向了同一个地址。 代码

List s1 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); List s2 = s1; System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2)); s2.remove("g"); s2.remove("h"); System.out.println("s1: " + s1); System.out.println("s2: " + s2); 结果: s1地址和s2是否相等(是否为同一个对象): true s1: [a, b, c, d, e, f] s2: [a, b, c, d, e, f]

所以我们需要使用 List list1= new ArrayList(list0); 的方式 代码

List s1 = new ArrayList(Arrays.asList("a,b,c,d,e,f,g,h".split(","))); List s2 = new ArrayList(s1); System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2)); s2.remove("g"); s2.remove("h"); System.out.println("s1: " + s1); System.out.println("s2: " + s2); 结果: s1地址和s2是否相等(是否为同一个对象): false s1: [a, b, c, d, e, f, g, h] s2: [a, b, c, d, e, f]

同时,我们1在使用 removeAll() 方法时,有时候会遇到报错或者失效的情形,比如List中是一个一个对象类,且没有重写过equals和hashCode方法,就会带来这种不相等的情况,从而导致失效,这个问题也要注意一下。

来源: https://www. tuicool.com/articles/Br EvmqJ


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3